function addQRCode(qrcode, x, y, width, rotation, charsetName = "UTF-8") {
	return {
		qrcode: qrcode,
		x: x,
		y: y,
		width: width,
		rotation: rotation,
		charsetName: charsetName
	};
}

function newMapArray(arrayA, arrayB) {
	const newArrayData = arrayA.map(item => {
		return arrayB.reduce((acc, {
			lable,
			lableKey
		}) => {
			acc[lable] = item[lableKey]; // 根据 lableKey 提取值，并以 lable 作为键
			return acc;
		}, {});
	});
	return newArrayData
}


function splitStringAndAddToData(str, x, initTop, yIncrement, data, chunkSize = 12) {
	const arr = splitStringByTen(str, chunkSize);
	// let y = initTop;

	arr.forEach(item => {
		data.push({
			text: item,
			rotation: 0,
			x: x,
			y: initTop,
			// y: y,
			xscal: 1,
			yscal: 1
		});

		initTop += yIncrement;
		// y += yIncrement;
	});

	initTop = +initTop + 30 * (arr.length - 1);

	return {
		data: data,
		initTop: initTop,
	}
}

function dynamicLogic(formData, data, config, chunkSize = 12) {
	const {
		initTop,
		textX,
		yIncrement,
		xscal = 1,
		yscal = 1,
	} = config;
	let currentY = initTop;

	// 动态添加字段
	for (const key in formData) {
		if (formData.hasOwnProperty(key)) {

			let arr = splitStringByTen(`${key}: ${formData[key]}`, chunkSize)

			arr.forEach(item => {
				data.push({
					text: item,
					rotation: 0,
					x: textX,
					y: currentY,
					xscal: xscal,
					yscal: yscal
				});
				currentY += yIncrement;

			});
		}
	}
	return data
}

// function splitStringByTen(str) {
// 	// 如果字符串长度小于或等于10，直接返回包含原字符串的数组  
// 	if (str.length <= 12) {
// 		return [str];
// 	}

// 	// 使用正则表达式将字符串按照每十个字符进行分割  
// 	// 正则表达式中的.{1,10}表示匹配1到10个字符，?表示非贪婪匹配（尽可能少地匹配）  
// 	// g表示全局匹配，即找到所有匹配项  
// 	return str.match(/.{1,12}/g);
// }


/**
 * 将字符串按照指定长度分割成数组
 * @param {string} str - 需要分割的字符串
 * @param {number} [chunkSize=12] - 每个子字符串的最大长度，默认为12
 * @returns {string[]} - 返回分割后的字符串数组
 * @throws {Error} - 如果输入参数不合法，抛出错误
 */
function splitStringByTen(str, chunkSize = 12) {
	// 参数校验
	if (typeof str !== 'string') {
		throw new Error('输入必须是一个字符串');
	}
	if (typeof chunkSize !== 'number' || chunkSize < 1) {
		throw new Error('chunkSize 必须是一个大于或等于 1 的数字');
	}
	// 如果字符串为空，直接返回空数组
	if (str.length === 0) {
		return [];
	}

	// 如果字符串长度小于或等于 chunkSize，直接返回包含原字符串的数组  
	if (str.length <= chunkSize) {
		return [str];
	}

	// 使用正则表达式将字符串按照每 chunkSize 个字符进行分割  
	// 正则表达式中的 .{1,chunkSize} 表示匹配1到 chunkSize 个字符
	// ? 表示非贪婪匹配（尽可能少地匹配），避免匹配超出 chunkSize 的字符
	// g 表示全局匹配，即找到所有匹配项  
	const regex = new RegExp(`.{1,${chunkSize}}`, 'g');
	const result = str.match(regex);

	// 如果正则匹配失败（理论上不会发生，但为了健壮性），返回包含原字符串的数组
	return result || [str];
}

// 获取合并后的配置
function getMergedConfig(config) {
	// 默认配置
	const defaultConfig = {
		initTop: 10, // 初始文字 y轴位置
		textX: 160, // 文字的 x轴位置
		yIncrement: 30, // 每行文字之间的间距
		lineSize: {
			width: 60, // 标签纸宽度 (mm)
			height: 40, // 标签纸高度 (mm)
			gap: 3, // 标签纸之间的间隙 (mm)
			page: 1, // 打印份数
			direction: 0, // 打印方向
			x: 0, // 初始坐标 左距离 x 值
			y: 0, // 初始坐标 顶部距离 y 值
		}
	};

	return {
		...defaultConfig,
		...config,
		lineSize: {
			...defaultConfig.lineSize,
			...(config.lineSize || {}) // 确保 lineSize 也被合并
		}
	};
}

/**
 * 打印排版框架
 * @param {Object} formData - 表单数据
 * @param {Function} injectLogic - 外部注入的逻辑函数
 * @param {Object} config - 配置对象
 * @returns {Array} - 返回打印数据数组
 */
function PrintFun(formData, injectLogic, config = {}) {
	// 获取合并后的配置
	const finalConfig = getMergedConfig(config);

	// 初始化数据数组
	let data = [];

	data.push(finalConfig.lineSize)

	// 调用外部注入的逻辑函数
	if (typeof injectLogic === 'function') {
		injectLogic(formData, data, finalConfig);
	}

	return data;
}


export default {
	addQRCode,
	newMapArray,
	splitStringAndAddToData,
	dynamicLogic,
	splitStringByTen,
	PrintFun
}